package riaxprez;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Pagination;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.util.Callback;

public class ViewCreation {
	
    public ViewCreation(AppModel model){
        this.model = model;
        stage = new Stage();
        init(stage);
    }
    
    public VBox createPage(int pageIndex) {	
        for (int i = pageIndex; i < pageIndex + 1; i++) {
        	box = new VBox(5);
        	isGraph = model.slides.get(i).isGraphique();
        	pageCourante=i;
        	titre = new TextField(model.slides.get(i).getTitre());
            contenu = new HTMLEditor();
            contenu.setHtmlText(model.slides.get(i).getContenu());
            contenu.setPrefSize(100, 300);
            HBox hbox = new HBox(4); 
            lbGraphAddTitre = new Label("Titre graphique");
            fieldGraphAddTitre = new TextField("");
            btGraphAdd = new Button("Ajouter un graphique");
            
            hbox.getChildren().add(lbGraphAddTitre);
            hbox.getChildren().add(fieldGraphAddTitre);
            hbox.getChildren().add(btGraphAdd);
           
            box.getChildren().add(titre);
            box.getChildren().add(contenu);
            box.getChildren().add(hbox);
            if(isGraph){
            	affichePartieGraph();
            }else{
            	pagination.setPrefSize(1100, 500);
            }
            /* Ajouter un graphique */
            btGraphAdd.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                	affichePartieGraph();
                }
            });
        }
        return box;
    }
    
    private void save(){
    	if(isGraph){
    		model.saveSlide(pageCourante, titre.getText(), contenu.getHtmlText(), graphique.getData(), graphique.getTitle());
    	}else{
    		model.saveSlide(pageCourante, titre.getText(), contenu.getHtmlText());
    	}
    }
    
    /* Affichage du graphique */
    private void affichePartieGraph(){
    	isGraph=true;
    	pagination.setPrefSize(1100, 1000);
    	btGraphAdd.setDisable(true);
    	
    	graphique = createChart(model.getSlides().get(pageCourante).isGraphique());
    	
    	HBox hbox = new HBox(3); 
    	lbAjoutPart = new Label("Nom part / Coefficient");
        ajoutPartName = new TextField();
        ajoutPartCoeff = new TextField();
        btAjoutPart = new Button("Ajouter Partie");
        btSupprPart = new Button("Reset graphique");
        hbox.getChildren().add(lbAjoutPart);
        hbox.getChildren().add(ajoutPartName);
        hbox.getChildren().add(ajoutPartCoeff);
        hbox.getChildren().add(btAjoutPart);
        hbox.getChildren().add(btSupprPart);
        
        
        box.getChildren().add(hbox);
    	box.getChildren().add(graphique);
    	
    	btSupprPart.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
            	graphique.getData().removeAll(graphique.getData());
            }
        });
    	
    	/* ajoute partie du graphique */
        btAjoutPart.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
            	graphique.getData().add(new PieChart.Data(ajoutPartName.getText(), Integer.valueOf(ajoutPartCoeff.getText())));
            }
        });
    }
    
    /* Creation du graphique */
    protected PieChart createChart(boolean isGraphique) {
    	//Si le graphique existe deja
    	if(isGraphique){
    		PieChart pc = new PieChart(model.getSlides().get(pageCourante).getListeData());
    		pc.setTitle(model.getSlides().get(pageCourante).getTitreGraph());
    		return pc;
    	}else{
    		PieChart pc = new PieChart(FXCollections.observableArrayList(
    	            new PieChart.Data("Exemple", 100)
    	        ));
    	        // setup chart
    	     pc.setId("Graphique");
    	     pc.setTitle(fieldGraphAddTitre.getText());
    	     return pc;
    		
    	}
        
    }
    
    private void init(Stage stage){
        /* Panel principal */
        root = new BorderPane();
        //root.setPrefWidth(800);
        //root.setPrefHeight(600);

        /* Panel du haut contenant le titre */
        pnTop = new HBox();
        pnTop.setPrefWidth(200);
        pnTop.setPrefHeight(100);
        pnTop.setAlignment(Pos.BOTTOM_CENTER);
        pnTop.setPadding(new Insets(20,20,20,30));
        
        lbTitle = new Label("EIA - PREZ - Creation");
        lbTitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 30));
        pnTop.getChildren().add(lbTitle);
        
        scrollPane = new ScrollPane();
        scrollPane.setPrefSize(1000, 600);
        pnCenter = new VBox();
        pnCenter.setAlignment(Pos.CENTER);
        //pnCenter.setPadding(new Insets(20,20,20,30));
        pagination = new Pagination(model.getNbPage());
        pagination.setPrefSize(1100, 500);
        pagination.setPageFactory(new Callback<Integer, Node>() {
            @Override
            public Node call(Integer pageIndex) {
                if (pageIndex >= model.getNbPage()) {
                    return null;
                } else {
                    return createPage(pageIndex);
                }
            }
        });
        
        /* Evenement pour sauver a chaque changement de page */
        pagination.currentPageIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
                save();
            }
        });
        
        scrollPane.setContent(pagination);
        scrollPane.setFitToWidth(true);
        pnCenter.getChildren().add(scrollPane);
        HBox bot = new HBox();
        btnSwitchToPrez = new Button("Mode présentation");
        bot.getChildren().add(btnSwitchToPrez);
        bot.setAlignment(Pos.CENTER);
        /* Assignation des panels au panel principal */
        root.setTop(pnTop);
        root.setCenter(pnCenter);
        root.setBottom(bot);
        
        /* Assignation du panel principal a la scene */
        scene = new Scene(root, 1200, 800);
        stage.setTitle("Accueil");
        stage.setScene(scene);
        stage.show();
    }
    
    AppModel model;
	
	/* IHM */
    Stage stage;
    Scene scene;
    
    Pagination pagination;
    
    /* Layout / Panel */
    BorderPane root;
    HBox pnTop;
    VBox pnCenter;
    ScrollPane scrollPane;
    
    /* Labels */
    Label lbTitle;
    
    TextField titre;
    HTMLEditor contenu;
    
    /* Boutons */   
    Button btGraphAdd;
    Button btnSwitchToPrez;
    
    
    /* Graphique */
    PieChart graphique;
    Label lbAjoutPart;
    Label lbGraphAddTitre;
    TextField ajoutPartName;
    TextField ajoutPartCoeff;
    TextField fieldGraphAddTitre;
    Button btAjoutPart;
    Button btSupprPart;
    
	VBox box;
    
    int pageCourante=0;
    boolean isGraph =false;

}
